
/*
  funciones que hacen control de comprobantes pendientes de CAE.
  
  Se usa la funcion auxiliar getmensajecommcaependientecandidatos(ptipocai) para
  forzar el uso del indice comm.tipocai_codcai. Postgres no lo usaba en su plan de ejecucion y
  sin el uso del indice la funcion demoraba mucho.  
*/

CREATE OR REPLACE FUNCTION getmensajecommcaependientecandidatos(varchar)
    RETURNS TABLE(idcomm integer) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000
AS $BODY$
DECLARE
pTipoCai   ALIAS FOR $1;
BEGIN
  RETURN QUERY
	  SELECT id FROM comm WHERE comm.tipocai = pTipoCai AND comm.codcai IS NULL;
END
$BODY$;
ALTER FUNCTION getmensajecommcaependientecandidatos(varchar) OWNER TO abacouser;


CREATE OR REPLACE FUNCTION public.getmensajecommcaependiente(
	character varying,
	timestamp without time zone,
	character varying,
	character varying,
	character varying,
	character varying)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Para probar: SELECT getmensajecommcaependiente('** Anulado **', '2022-09-14'::date, 'W', 'a0a1a2', '%a1%', 'a0')  AS mensaje 

-- Funcion para verificar si hay comprobantes electronicos emitidos sin CAE asignado
-- La funcion recupera comprobante mas viejo pendiente de CAE emitido por la empresa.
-- La condicion de electronico emitido  es por tipocai = 'W'
-- La condicion de emitido por la empresa es por la sucursal del comprobante en lista de sucursales de la empresa.
-- Tiene en cuenta que el comprobante no este anulado
DECLARE
pStrAnulado     ALIAS FOR $1;        
pFecha          ALIAS FOR $2;
ptipocai        ALIAS FOR $3;        
pSysEmpSuc      ALIAS FOR $4;
pSYS_User_Like 	ALIAS FOR $5;
pSYS_UniSuc		ALIAS FOR $6;

vRta          varchar;

BEGIN
-- NOTA: (14/06/2022)  
-- el uso de la funcion getmensajecommcaependientecandidatos(ptipocai) es para forzar el plan de ejecucion y que use el indice por tipocai-codcai. 
-- En varios postgres (pg-9.6, pg-13) no usaba este indice cuando se hacia un query unico con todos los wheres. 
-- En pg-11 si usaba el indice y en pg-9.5 tambien

   SELECT to_char(comm.fecha,'DD/MM/YYYY') ||' - Sucursal: ' || ambsuc.nombre || ' - ' || com.nombre
   FROM comm
      INNER JOIN getmensajecommcaependientecandidatos(ptipocai) x ON comm.id = x.idcomm
      INNER JOIN ambsuc ON ambsuc.cod = comm.codambsuc
      INNER JOIN com ON com.tipo = comm.tipocom 
   WHERE comm.detalle <> pStrAnulado AND
         pSysEmpSuc LIKE '%' || comm.codambsuc || '%' AND
         (ambsuc.accesousuarios = '*' or ambsuc.accesousuarios ilike pSYS_User_Like) AND
         POSITION(comm.codambsuc in pSYS_UniSuc) > 0 AND
         comm.fecha <= COALESCE(pFecha, comm.fecha)    
   ORDER BY fecha
   LIMIT 1
  INTO vRta;   

  IF (COALESCE(vRta, '') <> '') THEN
      vRta := 'Hay comprobantes fiscales sin CAE asignado. (' || vRta || ')';
   END IF;
   RETURN COALESCE(vRta, '');
END;
$BODY$;

ALTER FUNCTION public.getmensajecommcaependiente(character varying, timestamp without time zone, character varying, character varying, character varying, character varying)
    OWNER TO abacouser;
    
 -- ==================================
 SELECT aaVersion('483.01', '483.00');
 -- ==================================
